MFC程序默认系统DPI96时调整的界面,在 【个性设置-显示-中等(win7, xp类似)】 后,
出现控件错位的问题,是因为调整后DPI发生变化,相对的坐标也需要重新调整,修改方法如下:
1.调整函数的实现
#define DEFAULT_DPI 96.0
static int dpiX;
static int dpiY;
void moveWindow( CWnd &wnd )
{
CRect rect;
wnd.GetWindowRect(rect);
wnd.GetParent()->ScreenToClient(rect);
rect.left = (int)(rect.left*DEFAULT_DPI/dpiX);
rect.right = (int)(rect.right*DEFAULT_DPI/dpiX);
rect.top = (int)(rect.top*DEFAULT_DPI/dpiY);
rect.bottom = (int)(rect.bottom*DEFAULT_DPI/dpiY);
rect.OffsetRect(CPoint((int)((dpiX-DEFAULT_DPI)/2), (int)((dpiY-DEFAULT_DPI)/2)));
wnd.MoveWindow(rect);
}
void SetDPI( int x, int y )
{
dpiX = x;
dpiY = y;
}
int GetDPIX()
{
return dpiX;
}
int GetDPIY()
{
return dpiY;
}
2.设置dpi在程序第一个对话框初始化OnInitDialog()时,添加如下代码:
CDC* dc = GetDC(); int dpiX = GetDeviceCaps(dc->GetSafeHdc(), LOGPIXELSX); int dpiY = GetDeviceCaps(dc->GetSafeHdc(), LOGPIXELSY); SetDPI(dpiX, dpiY); ReleaseDC(dc);
如果有通过SetWindowPos函数设置的控件,需要进行比例转换,例如:
button.SetWindowPos(NULL,0,0,(size_t)(width/DEFAULT_DPI*dpiX),
(size_t)(height/DEFAULT_DPI*dpiY),SWP_NOMOVE);
之后再调用函数moveWindow(CWnd &wnd)就可以进行坐标转换了。
本页共49段,1320个字符,1687 Byte(字节)